/* Copyright  2009
   @Author
   Richard Changde Yin            e-mail yinchangde@hotmail.com

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

/**
 * @filename: xid.h
 */

#ifndef __DB_XID_H__
#define __DB_XID_H__
//Todo : get/retrieve it from the configuration
extern uint32_t server_id;

/**
  class XID _may_ be binary compatible with the XID structure as
  in the X/Open CAE Specification, Distributed Transaction Processing:
  The XA Specification, X/Open Company Ltd., 1991.
  http://www.opengroup.org/bookstore/catalog/c193.htm

*/

typedef uint64_t my_xid; // this line is the same as in log_event.h

#define COLLAPSAR_XIDDATASIZE      128
#define COLLAPSAR_XID_PREFIX       "CLPSARXid"
#define COLLAPSAR_XID_PREFIX_LEN   8 // must be a multiple of 8
#define COLLAPSAR_XID_OFFSET    (COLLAPSAR_XID_PREFIX_LEN+sizeof(server_id))
#define COLLAPSAR_XID_GTRID_LEN (COLLAPSAR_XID_OFFSET+sizeof(my_xid))

#define XIDDATASIZE COLLAPSAR_XIDDATASIZE

class XID {

public:

  long formatID;

  long gtrid_length;

  long bqual_length;

  char data[XIDDATASIZE];  // not \0-terminated !

  XID();

  bool eq(XID *xid);
  bool eq(long g, long b, const char *d);

  void set(XID *xid);
  void set(long f, const char *g, long gl, const char *b, long bl);
  void set(uint64_t xid);
  void set(long g, long b, const char *d);

  bool is_null();
  void null();

  my_xid quick_get_my_xid();
  my_xid get_my_xid();

  uint32_t length();
  unsigned char *key();
  uint32_t key_length();
};

/**
  struct st_collapsar_xid is binary compatible with the XID structure as
  in the X/Open CAE Specification, Distributed Transaction Processing:
  The XA Specification, X/Open Company Ltd., 1991.
  http://www.opengroup.org/bookstore/catalog/c193.htm

*/
struct st_collapsar_xid {
  long formatID;
  long gtrid_length;
  long bqual_length;
  char data[COLLAPSAR_XIDDATASIZE];  /* Not \0-terminated */
};
typedef struct st_collapsar_xid COLLAPSAR_XID;

enum xa_states {
                XA_NOTR=0,
                XA_ACTIVE,
                XA_IDLE,
                XA_PREPARED};
extern const char *xa_state_names[];

/* for recover() handlerton call */
#define MIN_XID_LIST_SIZE  128
#define MAX_XID_LIST_SIZE  (1024*128)

typedef struct st_xid_state {
  /* For now, this is only used to catch duplicated external xids */
  XID  xid;                           // transaction identifier
  enum xa_states xa_state;            // used by external XA only
  bool in_session;
} XID_STATE;

bool xid_cache_init(void);
void xid_cache_free(void);
XID_STATE *xid_cache_search(XID *xid);

bool xid_cache_insert(XID *xid, enum xa_states xa_state);
bool xid_cache_insert(XID_STATE *xid_state);
void xid_cache_delete(XID_STATE *xid_state);

#endif /* __DB_XID_H__ */
